package com.third.device.mg.serialport.factory.jiecang.product

import com.third.device.mg.serialport.factory.jiecang.BaseJieCangProduct
import com.third.device.mg.serialport.utils.crc16
import com.third.device.mg.serialport.utils.to2ByteH

/**
 * @Date 2022/10/27
 * Description:平移导台 、榻榻米升降器
 * 有适配器的指令
 *
 *
 * 错误返回error
 * 错误代码说明：
 * 错误代码	说明
 * 03	    非法数据值，写寄存器超出范围
 * 08	    校验出错
 * 01	    非法功能
 * 状态	从机地址	功能码	错误代码	CRC低	CRC高
 * 接收	01	    06	    03	    A1	    63
 *      01	    06	    08	    22	    66
 *      01	    06	    01	    E2	    60
 */
class TranslationAdapterDesk : BaseJieCangProduct(){
    override fun productDescribe(): String = "捷昌公司升降桌系统 -- 平移导台 、榻榻米升降器(有适配器的指令) "


    /**
     * 获取当前位置（当前高度）
     * 状态	从机地址	功能码	高位地址	低位地址	高位数据	低位数据	CRC低	CRC高
     * 发送	01	    03	    00	    10	    00	    01	    85	    CF
     */
    fun getLocation():ByteArray{
        val msg =  byteArrayOf(
            0x01 ,0x03 , 0x00 ,0x10 , 0x00 , 0x01
        )
        return msg.crc16()
    }


    /**
     * 行程范围
     * 状态	从机地址	功能码	高位地址	低位地址	高位数据	低位数据	CRC低	CRC高
     * 发送	01	    03	    00	    11	    00	    02	    94	    OE
     */
    fun getRouteScope():ByteArray{
        val msg =   byteArrayOf(
            0x01 ,0x03 , 0x00 ,0x11 , 0x00 , 0x02
        )
        return msg.crc16()
    }


    /**
     * 获取上高度
     */
    fun getAboveHeight():ByteArray{
        val msg =   byteArrayOf(
            0x01 ,0x03 , 0x00 ,0x11 , 0x00 , 0x01
        )
        return msg.crc16()
    }

    /**
     * 获取下高度
     */
    fun getBelowHeight():ByteArray{
        val msg =   byteArrayOf(
            0x01 ,0x03 , 0x00 ,0x12 , 0x00 , 0x01
        )
        return msg.crc16()
    }

    /**
     * 获取限位信息
     * 发送：01 03 00 13 00 02 35 CE
     * 状态	从机地址	功能码	高位地址	低位地址	高位数据	低位数据	CRC低	CRC高
     * 发送	01	03	00	13	00	03	35	0E
     * 接收：01 03 00 00 F1 D8（无限位信息）
     * 01 03 03 01 01 92 94 73(上限位信息)
     * 01 03 03 10 01 2C 44 06(下限位信息)
     * 01 03 05 11 01 92 01 2C CD EE（上下限位信息）
     * 存储地址：0x0013~0x0017。0x0013标识数据。0x0014~15上限位数据。0x0016~17下限位数据
     * 标识：00未设置限位，01设置了上限位，10设置了下限位，11设置了上下限位
     * 状态	从机地址	功能码	字节计数	标识数据	上限位	下限位	CRC低	CRC高
     * 接收	无限位	01	03	00	00	-	-   -   -   F1	D8
     *      上限位	01	03	03	01	01	92	-	-   94	73
     *      下限位	01	03	03	10	-	-   01	2C	44	06
     *      上下限位	01	03	05	11	01	92	01	2C	CD	EE
     *
     */
    fun getLimitInfo():ByteArray{
        val msg =   byteArrayOf(
            0x01 ,0x03 , 0x00 ,0x13 , 0x00 , 0x02
        )
        return msg.crc16()
    }

    /**
     * 获取异常信息
     * 发送：01 03 00 18 00 01 04 0D
     * 状态	从机地址	功能码	高位地址	低位地址	高位数据	低位数据	CRC低	CRC高
     * 发送	01	03	00	18	00	01	04	0D
     * 接收：
     * 存储地址：0x0018
     * 01 03 01 00 21 88 5C（RST复位状态）
     * 01 03 01 00 17 08 4A（E07霍尔异常）
     * 01 03 01 00 1E C8 4C(H01工作制保护)
     * 01 03 01 00 1F 09 8C（H02过热保护）
     * 01 03 01 00 12 49 C8（上升中）
     * 01 03 01 00 15 8B 89(下降中)
     * 01 03 01 00 25 9F 89(停止)
     */
    fun getExceptionInfo():ByteArray{
        val msg =   byteArrayOf(
            0x01 ,0x03 , 0x00 ,0x18 , 0x00 , 0x01
        )
        return msg.crc16()
    }

    /**
     * 上升
     */
    fun up():ByteArray{
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x35,0x00,0x01
        )
        return msg.crc16()
    }

    /**
     * 下降
     */
    fun down():ByteArray{
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x36,0x00,0x01
        )
        return msg.crc16()
    }

    /**
     * 停止（正常停止，有缓冲）
     */
    fun stop():ByteArray{
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x37,0x00,0x01
        )
        return msg.crc16()
    }

    /**
     * 急停（立刻急停，无缓冲）
     * 指令无效 -- 厨电吊柜使用
     */
    fun stopAtOnce():ByteArray{
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x42,0x00,0x01
        )
        return msg.crc16()
    }

    /**
     * 运行到指定高度
     * @param height 高度 单位:mm
     * 范围:[下限位,上限位]
     * 不在范围内，会返回错误代码03（非法数据值，写寄存器超出范围）
     * 状态	从机地址	功能码	错误代码	CRC低	CRC高
     * 接收	01	    06	    03	    A1	    63
     */
    fun run(height:Int):ByteArray{
        val heightArray = height.to2ByteH()
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x38,heightArray[0],heightArray[1]
        )
        return msg.crc16()
    }


    /**
     * 进入复位状态
     */
    fun entryResetStatus():ByteArray{
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x39,0x00 ,0x01
        )
        return msg.crc16()
    }

    /**
     * 开始复位
     */
    fun startReset():ByteArray{
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x40,0x00 ,0x01
        )
        return msg.crc16()
    }

    /**
     * 停止复位
     */
    fun stopReset():ByteArray{
        val msg = byteArrayOf(
            0x01 ,0x06,0x00,0x41,0x00 ,0x01
        )
        return msg.crc16()
    }
}